﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HS.Log.ILogger
{
    /// <summary>
    /// HSLog接口  实现实现此接口主要记录程序日志
    /// <para>日志记录</para>
    /// <para>日志可以使用 DEBUG、INFO、WARN、ERROR和FATAL记录这五个级别是有顺序的，DEBUG小于INFO小于WARN小于ERROR小于FATAL</para>
    /// <para>1：DEBUG 这个级别最低的东东，一般的来说，在系统实际运行过程中，一般都是不输出的。因此这个级别的信息，可以随意的使用，任何觉得有利于在调试时更详细的了解系统运行状态的东东，比如变量的值等等，都输出来看看也无妨。</para>
    /// <para>2：INFO 这个应该用来反馈系统的当前状态给最终用户的，所以，在这里输出的信息，应该对最终用户具有实际意义，也就是最终用户要能够看得明白是什么意思才行。从某种角度上说，Info 输出的信息可以看作是软件商品的一部分（就像那些交互界面上的文字一样），所以需要谨慎对待，不可随便。</para>
    /// <para>3：WARN、ERROR和FATAL：警告、错误、严重错误，这三者应该都在系统运行时检测到了一个不正常的状态，他们之间的区别，要区分还真不是那么简单的事情。</para>
    /// <para>      所谓警告，应该是这个时候进行一些修复性的工作，应该还可以把系统恢复到正常状态中来，系统应该可以继续运行下去。</para>
    /// <para>      所谓错误，就是说可以进行一些修复性的工作，但无法确定系统会正常的工作下去，系统在以后的某个阶段，很可能会因为当前的这个问题，导致一个无法修复的错误（例如宕机），但也可能一直工作到停止也不出现严重问题。</para>
    /// <para>      所谓Fatal，那就是相当严重的了，可以肯定这种错误已经无法修复，并且如果系统继续运行下去的话，可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常，而是尽可能地保留系统有效数据并停止运行。</para>
    /// <para>      也就是说，选择 Warn、Error、Fatal 中的具体哪一个，是根据当前的这个问题对以后可能产生的影响而定的，如果对以后基本没什么影响，则警告之，如果肯定是以后要出严重问题的了，则Fatal之，拿不准会怎么样，则 Error 之</para>
    /// </summary>
    public interface IHSLog
    {
        #region DebugAsync
        /// <summary>
        /// Debug
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="mark">标记3 记录文件日志时作为文件名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Debug(string source, string tranCode, string mark, Object msg, StackFrame stack = null);
        /// <summary>
        /// Debug
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Debug(string source, Object msg, StackFrame stack = null);
        /// <summary>
        /// Debug
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Debug(string source, string tranCode, Object msg, StackFrame stack = null);

        #endregion

        #region InfoAsync
        /// <summary>
        /// Info
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="mark">标记3 记录文件日志时作为文件名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Info(string source, string tranCode, string mark, Object msg, StackFrame stack = null);
        /// <summary>
        /// Info
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Info(string source, Object msg, StackFrame stack = null);
        /// <summary>
        /// Info
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Info(string source, string tranCode, Object msg, StackFrame stack = null);

        #endregion

        #region WarnAsync
        /// <summary>
        /// Warn
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="mark">标记3 记录文件日志时作为文件名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Warn(string source, string tranCode, string mark, Object msg, StackFrame stack = null);
        /// <summary>
        /// Warn
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Warn(string source, Object msg, StackFrame stack = null);
        /// <summary>
        /// Warn
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Warn(string source, string tranCode, Object msg, StackFrame stack = null);

        #endregion

        #region ErrorAsync
        /// <summary>
        /// Error
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="mark">标记3 记录文件日志时作为文件名存在</param>
        /// <param name="ex">错误信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Error(string source, string tranCode, string mark, Exception ex, StackFrame stack = null);
        /// <summary>
        /// Error
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="ex">错误信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Error(string source, Exception ex, StackFrame stack = null);
        /// <summary>
        /// Error
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="ex">错误信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Error(string source, string tranCode, Exception ex, StackFrame stack = null);

        #endregion

        #region FatalAsync
        /// <summary>
        /// Warn
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="mark">标记3 记录文件日志时作为文件名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Fatal(string source, string tranCode, string mark, Object msg, StackFrame stack = null);
        /// <summary>
        /// Warn
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Fatal(string source, Object msg, StackFrame stack = null);
        /// <summary>
        /// Warn
        /// </summary>
        /// <param name="source">标记1</param>
        /// <param name="tranCode">标记2 记录文件日志时作为文件夹名存在</param>
        /// <param name="msg">日志信息</param>
        /// <param name="stack">堆栈信息 堆栈信息主要包括 模块+命名空间+类名+方法名+行号，缺省值为调用此方法的堆栈信息</param>
        void Fatal(string source, string tranCode, Object msg, StackFrame stack = null);
        #endregion
    }
}
